package com.lancoo.edu.platform.operation.backupRestore.strategy.backupRestore.imp;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.lancoo.edu.platform.operation.backupRestore.constant.BackupRestoreConstant;
import com.lancoo.edu.platform.operation.backupRestore.strategy.backupRestore.BackupRestoreStrategy;
import com.lancoo.edu.platform.operation.commons.utils.database.MysqlExportImportUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @author zhang.ws
 * @date 2024/2/19 11:36
 * @description Mysql数据库备份还原策略实现类
 */
@Slf4j
@Service
public class MysqlBackupRestoreStrategy implements BackupRestoreStrategy {

    /**
     * 备份方法
     *
     * @param sysId        系统ID
     * @param databaseName 数据库
     * @param savePath     保存地址（目录不包括文件）
     * @param databaseDump 对应数据库导出引擎地址
     * @param userName     用户名
     * @param password     密码
     * @param port         端口
     * @param host         数据库所在IP
     */
    @Override
    public String backup(String sysId, String databaseName, String savePath, String databaseDump, String userName, String password, String host, String port) {
        String currentTime = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
        String fileName = StringUtils.contains(databaseName, ",") ? "databases" + "_" + currentTime + ".sql" : sysId + "_" + databaseName + "_" + currentTime + ".sql";
        String exportSql = MysqlExportImportUtil.exportSql(databaseDump, userName, password, host, port, databaseName, savePath, fileName);
        log.info("【mysql备份{}，时间：{}】", StringUtils.isBlank(exportSql) ? "失败" : exportSql, currentTime);
        return StringUtils.isNotBlank(exportSql) ? exportSql : BackupRestoreConstant.ERROR_BOOLEAN;
    }

    /**
     * 还原方法
     *
     * @param sysId        系统ID
     * @param databaseName 数据库
     * @param savePath     还原的文件地址
     * @param saveDir      保存地址（目录不包括文件）
     * @param databaseDump 对应数据库导出引擎地址
     * @param userName     用户名
     * @param password     密码
     * @param port         端口
     * @param host         数据库所在IP
     */
    @Override
    public String restore(String sysId, String databaseName, String savePath, String saveDir, String databaseDump, String userName, String password, String host, String port) {
        boolean importSql = MysqlExportImportUtil.importSql(databaseDump, userName, password, host, port, databaseName, savePath);
        log.info("【mysql还原{}：{}，时间：{}】", importSql ? "成功" : "失败", savePath, DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN));
        return importSql ? savePath : BackupRestoreConstant.ERROR_BOOLEAN;
    }
}
